export type MouseType = 'mouseup' | 'mousedown'

export enum ZONE {
  UNVALID = 'unvalid',
  UNKNOWN = 'unknown',
  TOOLBAR = 'toolbar',
  TOOLTIP = 'tooltip',
  EDITABLE = 'editable',
  ASIDE = 'aside',
}

export enum RANGE_OFFSET {
  /** 聚焦在元素左侧 */
  LEFT = -1,
  /** 聚焦在元素上 */
  CENTER = 0,
  /** 聚焦在元素右侧 */
  RIGHT = 1,
}

export interface MouseZone {
  mousedown: ZONE
  mouseup: ZONE
}

export interface MouseElement {
  mousedown: HTMLElement | null
  mouseup: HTMLElement | null
}

export interface MousePath {
  mousedown: EventTarget[] | null
  mouseup: EventTarget[] | null
}

export interface MouseBlock {
  mousedown: boolean
  mouseup: boolean
}

export enum RangeType {
  /** 光标折叠在文字旁边 */
  INLINECOL = 'col inline',
  /** 选中一行中的部分文字 */
  INLINEROW = 'row inline',
  /** 光标聚焦在块儿元素上 */
  BLOCKCOL = 'col block',
  /** 空行 */
  EMPTYROW = 'emptyrow',
}

export enum CARETIN {
  BEFORE,
  INTERIOR,
  AFTER,
}

export interface RangePath {
  start: [number, number]
  end: [number, number]
}

/**
 * 折叠选区，目标为 inline 元素
 */
export interface InlineColRange {
  // collapsed: true
  type: RangeType.INLINECOL
  /** 行元素 */
  relative: HTMLElement
  /** 行元素在 editable 中的偏移量 */
  roffset: number
  /** 光标依附的元素 */
  node: HTMLElement
  /** 光标依附的元素在行元素中的偏移量 */
  offset: number
  /** 光标与依附的元素的相对位置（前/后） */
  caretin: CARETIN
}

/**
 * 多行选区中的一行
 */
export interface InlineRowRange {
  // collapsed: false
  type: RangeType.INLINEROW
  /** 行元素 */
  relative: HTMLElement
  /** 行元素在 editable 中的偏移量 */
  roffset: number
  /** 选区开始的元素 */
  start: HTMLElement
  /** 选区开始的元素在行元素中的偏移量 */
  soffset: number
  /** 选区结束的元素 */
  end: HTMLElement
  /** 选区结束的元素在行元素中的偏移量 */
  eoffset: number
}

/**
 * 空行
 */
export interface EmptyRowRange {
  // collapsed: true
  type: RangeType.EMPTYROW
  /** 行元素 */
  relative: HTMLElement
  /** 行元素在 editable 中的偏移量 */
  roffset: number
}

/**
 * 折叠选区，目标为 inline-block 元素
 */
export interface BlockColRange {
  // collapsed: true
  type: RangeType.BLOCKCOL
  /** 行元素 */
  relative: HTMLElement
  /** 行元素在 editable 中的偏移量 */
  roffset: number
  /** inline-block 元素 */
  node: HTMLElement
  /** inline-block 元素在行元素中的偏移量 */
  offset: number
  /** 光标的定位 */
  caretin: CARETIN
}

export type RangeLine = InlineColRange | InlineRowRange | EmptyRowRange | BlockColRange

export type RangeLines = RangeLine[]
